Confirmed deviations from R7RS

Identifiers are by default case-sensitive (see Using the compiler).

Number of arguments to procedures and macros

The maximal number of arguments that may be passed to a compiled procedure or macro is limited to around 1000. Likewise, the maximum number of values that can be passed to continuations captured using call-with-current-continuation is 1000. This is an implementation restriction that is unlikely to be lifted.

Numeric string-conversion considerations

In some cases the runtime system uses the numerical string-conversion routines of the underlying C library. Consequently, the procedures string->number, read, write, and display do not obey read/write invariance for inexact numbers.

Environments and non-standard syntax

In addition to the standard bindings, scheme-report-environment and null-environment contain additional non-standard bindings for the following syntactic forms: import, require-extension, require-library, begin-for-syntax, export, module, cond-expand, syntax, reexport, import-for-syntax.

Assignment to unbound variables

set! may assign values to unbound variables; this creates a new top-level binding for the variable, as if define had been used instead. This extension must be used with care, as typos might cause unexpected results:

> (let ((frob 5))
    (set! frov (+ frob 1))  ; oops!
    frob)
> 5
> frov
> 6

Unconfirmed deviations

char-ready?

The procedure char-ready? always returns #t for terminal ports.

Doubtful deviations

Non-deviations that might surprise you

let-syntax and letrec-syntax

let-syntax and letrec-syntax introduce a new scope.

equal? compares all structured data recursively

equal? compares all structured data with the exception of procedures recursively, while R7RS specifies that eqv? is used for data other than pairs, strings and vectors. However, R7RS does not dictate the treatment of data types that are not specified by R7RS


Previous: Using the compiler

Next: Extensions to the standard